home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_081 / icon / queens.icn < prev    next >
Text File  |  1992-05-06  |  1KB  |  56 lines

  1. #    QUEENS(6)
  2. #
  3. #    Solutions to n nonattacking queens
  4. #
  5. #    Stephen B. Wampler
  6. #
  7. #    Last modified 8/14/84
  8. #
  9.  
  10. global n, solution
  11.  
  12. procedure main(args)
  13.    local i
  14.    n := args[1] | 8        # 8 queens by default
  15.    if not(0 < integer(n)) then stop("parameter must be integer > 0")
  16.    solution := list(n)        # ... and a list of column solutions
  17.    write(n,"-Queens:")
  18.    every q(1)            # start by placing queen in first col.
  19. end
  20.  
  21. # q(c) - place a queen in column c.
  22. #
  23. procedure q(c)
  24.    local r
  25.    static up, down, rows
  26.    initial {
  27.       up := list(2*n-1,0)
  28.       down := list(2*n-1,0)
  29.       rows := list(n,0)
  30.       }
  31.    every 0 = rows[r := 1 to n] = up[n+r-c] = down[r+c-1] &
  32.       rows[r] <- up[n+r-c] <- down[r+c-1] <- 1        do {
  33.          solution[c] := r    # record placement.
  34.          if c = n then show()
  35.          else q(c + 1)        # try to place next queen.
  36.          }
  37. end
  38.  
  39. # show the solution on a chess board.
  40. #
  41. procedure show()
  42.    static count, line, border
  43.    initial {
  44.       count := 0
  45.       line := repl("|   ",n) || "|"
  46.       border := repl("----",n) || "-"
  47.       }
  48.    write("solution: ", count+:=1)
  49.    write("  ", border)
  50.    every line[4*(!solution - 1) + 3] <- "Q" do {
  51.       write("  ", line)
  52.       write("  ", border)
  53.       }
  54.    write(" ")
  55. end
  56.